iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

C# 從入門到WebApi系列 第 3

[Day3] 方法,那是什麼能吃嗎

  • 分享至 

  • xImage
  •  

DAY2 的補充

我在[DAY2] 現在讓我們正式進入C#的世界吧
中補上 do while, switch case,break 與 continue 的用法。
不瞭解的朋友可以去看看

在開始之前 我們來認識一下命名規範

在命名變數的時候我們通常會使用有意義的名稱
例如:

int AppleCount = 10; //蘋果的數量為10

你注意到了嗎
我命名的每個片語字首都是大寫
但是在區域變數或私有變數(後面會講)開頭應該為小寫

int appleCount = 10;

而且每個片語都是有意義的
應該避免命名成難以識別的的變數

int a;
string word;
string word2;

這種用片語的字首大小寫命名的方法稱為駝峰式命名
其他有關命名規範可見
(https://dotblogs.com.tw/regionbbs/2009/09/06/codingstandards)

講個小故事

在大學做專題的時候
強者我朋友把按鈕的名稱命名成button1,button2...
偏偏該頁面中又有很多的button
當我想對button1加新功能
就會不小心改到另一個按鈕
搞得讓人很火大

而且在你寫程式時也許知道button1,button2是什麼
但是過個不用2個月
說不定兩周回來維護的時候你就會忘記button1指的哪一個按鈕了

嘿,做個方法吧

方法(method) 或是稱為函式(function)指的是子區塊的程式碼
使用method能有效提升程式可用性與可讀性
將常用的程式區塊抽出,避免相同的程式重複出現
方法的宣告方法如下
https://ithelp.ithome.com.tw/upload/images/20200903/20109549nDl4CsDbYo.png

public static string GetFatherName(string Name,int birthday)
//先在這行上static不然會出錯 原因之後會解釋
{
    string result = Name+"的爸爸是連戰"+Name+"的生日是"+bithday;
    return result;//上面宣告回傳string,若不是宣告void 則一定要return東西
}
public static void Main(string[] args){
    string fatherName = GetFatherName("剩蚊",1010); //這裡Name = "剩蚊",birthay=1010
    Console.WriteLine(fatherName);
}
//剩蚊的爸爸是連戰剩蚊的生日是1010

其實方法很像一個工廠
我們先定義他的產出(回傳型態)
然後告訴他你需要的原料(參數)
他就會幫你產出你需要的

這邊有一種特殊的回傳型態void 作用是不回傳值

   public static void Test(){
       Console.WriteLine("test");
   }
   public static void Main(string[] args){
       Test();
   }
//test

來談談存取修飾詞

(這邊不懂可以先都用public 在封裝一章會講到)

存取修飾詞 存取範圍
public 沒有限制
protected 父類別或繼承父類的子類別
internal 目前專案
protected internal(我沒用過) 目前專案或繼承父類的子類別
private(預設) 當前類別

陣列與list

陣列跟List都是集合的概念;
宣告方法

陣列 list
資料型態[] 變數名稱; List<變數型態> 變數名稱;
int[] numberArray = new int[5]{1,2,3,4,5}; 宣告一個大小為5的陣列 裡面有5個元素分別為1~5
list<int> numberList = new list<int>(){1,2,3}; 宣告一個整數List 裡面有3個元素分別為1~3

兩者最大的差別在於陣列一旦宣告大小之後就不能改變
另外要注意的是陣列的起點是從0開始

int[] numberArray;
numArray = new int[3];
numArray[0] = 5;
numArray[1] = 8;
numArray[2] = 11;

//numArray = [5,8,11]

new

上面程式碼中的new 是指實例化物件
可以想像成把跟電腦說我要記憶體來放這個東西
(明天講解類別會再提到)

區域變數 靜態變數

  • 區塊變數: for while if 或是方法內等等中用大括弧圍住的程式碼
    例如:
public class Class1{
    private void Method1(){
        int b = 5;
        for(int i =0;i<5;i++ ){
            Console.WriteLine(i);
        }
        Console.WriteLine(i);//i為for迴圈的區塊變數 因此無法在for外面使用(編譯器會報錯)
    }
    
     private void Method2(){
        Console.WriteLine(b);//b為Method1的區塊變數 因此無法在Method2使用(編譯器會報錯)
    }
}
  • 靜態變數
    使用static 修飾詞
    static表示記憶體中永遠有它的位置
    程式執行時,static變數被放在全域變數區
    不需要new就能存取該變數
    且可以供多個物件存取
    直到程式被關閉才會消失

來做個排序演算法吧

不要聽到演算法就覺得很難很難
事實上演算法只是解決問題的方法
這邊使用簡單的bubble sort來做排序

bubble sort

他的概念很簡單
當遇到前面比後面大時候 就交換2者的位置
如果後面還有未排序的資料時繼續比較

回合數 資料 說明 i j
排序前 2,5,1,3
1 2,5,1,3 2 < 5 不交換 0 0
2 2,1,5,3 5 > 1 交換 0 1
3 2,1,3,5 5 > 3 交換 (5這時候為排序完的資料) 第一輪結束 0 2
4 1,2,3,5 1 < 2 交換 1 0
5 1,2,3,5 2 < 3 不交換 (由於5以排序完 所以3不會跟5比較) 第2輪結束 1 1
6 1,2,3,5 1 < 2 不交換 (由於3,5以排序完 所以2不會跟3比較) 第3輪結束 2 0
7 1,2,3,5
using System;

namespace MyFirstProgram
{
    class Program
    {
        public static void Main(string[] arg)
        {
            int[] unSortArray = new int[10]{55,12,33,5,4,44,88,65,25,40};//宣告一個未排序的陣列
            int[] sortedArray = BubbleSort(unSortArray);

            for (int i = 0; i < sortedArray.Length; i++)//印出陣列
            {
                Console.Write(sortedArray[i]+"\t");// "\t" 跟tab 差不多 Write 跟WriteLine的差別為WriteLine會換行
            }
        }
        static int[] BubbleSort(int[] array)//宣告一個排序方法 回傳類型為整數陣列 參數也是整數陣列
        {
            int temp = 0;

            for (int i = 0; i < array.Length; i++)
            {
                for (int j = 0; j < array.Length - 1 - i; j++)//比較到未排序前
                {
                    if (array[j] > array[j + 1])//如果前者>後者
                    {
                        temp = array[j];//這3行是交換兩者位置
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
            return array;
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20200903/20109549yQFCMIpzn5.png

大功告成~~~


上一篇
[DAY2] 現在讓我們正式進入C#的世界吧
下一篇
[Day4] 我知道Class 班級對吧
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jimmy
iT邦新手 5 級 ‧ 2020-09-26 12:22:22

想不透那樣方法執行是正常的,看起來好像前後比一次而已,後續我改了方法,覺得可能對新人會比較好懂
static int[] BubbleSort(int[] array)//宣告一個排序方法 回傳類型為整數陣列 參數也是整數陣列
{
int temp = 0;

        for (int i = 0; i < array.Length; i++)
        {
            for (int j = i+1; j < array.Length; j++)//第一個從後一位比到最後
            {
                if (array[i] > array[j])//如果前者>後者
                {
                    temp = array[i];//這3行是交換兩者位置
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        return array;
    }
Eric Xie iT邦新手 4 級 ‧ 2020-09-26 12:59:04 檢舉

你的方法是先找出比較小的值
因為前面畫的表格跟說明是先找出最大值
所以根據前面畫的表來做演算法~~

我要留言

立即登入留言